package com.evan.review.basic.collection;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.evan.review.R;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;

/**
 * ArrayList详解Activity
 * 
 * 本Activity详细介绍ArrayList的实现原理、特性和使用方法：
 * 1. ArrayList的底层数据结构与实现
 * 2. ArrayList常用操作与时间复杂度
 * 3. ArrayList的扩容机制
 * 4. ArrayList与Vector的区别
 * 5. ArrayList常见面试题与最佳实践
 */
public class ArrayListActivity extends AppCompatActivity {
    
    private TextView tvOutput;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data_structure);
        
        setTitle("ArrayList详解");
        
        tvOutput = findViewById(R.id.tv_output);
        
        // 展示ArrayList基本原理
        demonstrateArrayListPrinciple();
        
        // 展示ArrayList常用操作
        demonstrateArrayListOperations();
        
        // 展示ArrayList扩容机制
        demonstrateArrayListResizing();
        
        // 展示ArrayList使用注意事项
        demonstrateArrayListPitfalls();
        
        // 展示ArrayList常见面试题
        demonstrateInterviewQuestions();
    }
    
    /**
     * 展示ArrayList的基本原理
     */
    private void demonstrateArrayListPrinciple() {
        StringBuilder output = new StringBuilder();
        output.append("=== ArrayList底层原理 ===\n\n");
        
        // 1. 基本数据结构
        output.append("1. 基本数据结构：\n");
        output.append("• 底层基于动态数组实现\n");
        output.append("• 核心字段：\n");
        output.append("  - Object[] elementData: 存储元素的数组\n");
        output.append("  - int size: 实际元素个数\n");
        output.append("  - int DEFAULT_CAPACITY = 10: 默认初始容量\n\n");
        
        // 2. 构造方法
        output.append("2. 主要构造方法：\n");
        output.append("• ArrayList()：使用默认容量10创建空列表\n");
        output.append("• ArrayList(int initialCapacity)：指定初始容量\n");
        output.append("• ArrayList(Collection<? extends E> c)：使用现有集合创建\n\n");
        
        // 3. 核心特性
        output.append("3. 核心特性：\n");
        output.append("• 动态调整容量 - 按需增长\n");
        output.append("• 支持随机访问 - 实现RandomAccess接口\n");
        output.append("• 允许null元素\n");
        output.append("• 有序集合 - 按插入顺序排列\n");
        output.append("• 非线程安全\n");
        
        updateOutput(output.toString());
    }
    
    /**
     * 展示ArrayList常用操作
     */
    private void demonstrateArrayListOperations() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== ArrayList常用操作 ===\n\n");
        
        // 创建ArrayList
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Kotlin");
        list.add("Swift");
        
        // 1. 添加元素
        output.append("1. 添加元素：\n");
        output.append("// 创建并添加元素\n");
        output.append("List<String> list = new ArrayList<>();\n");
        output.append("list.add(\"Java\");      // 末尾添加，O(1) 分摊复杂度\n");
        output.append("list.add(\"Kotlin\");    // 当前list: [Java, Kotlin]\n");
        output.append("list.add(1, \"Python\"); // 指定位置添加，O(n) 最坏情况\n");
        list.add(1, "Python");
        output.append("// 当前list: " + list + "\n\n");
        
        // 2. 获取元素
        output.append("2. 获取元素：\n");
        output.append("list.get(0);             // 返回 Java, O(1)\n");
        output.append("list.get(1);             // 返回 Python, O(1)\n");
        output.append("list.indexOf(\"Swift\"); // 返回 3, O(n)\n");
        output.append("list.contains(\"Java\"); // 返回 true, O(n)\n\n");
        
        // 3. 更新元素
        output.append("3. 更新元素：\n");
        output.append("list.set(1, \"C++\");    // 替换索引1处元素为C++, O(1)\n");
        list.set(1, "C++");
        output.append("// 当前list: " + list + "\n\n");
        
        // 4. 删除元素
        output.append("4. 删除元素：\n");
        output.append("list.remove(0);          // 删除索引0处元素, O(n)\n");
        list.remove(0);
        output.append("// 当前list: " + list + "\n");
        output.append("list.remove(\"Swift\");  // 删除值为Swift的元素, O(n)\n");
        list.remove("Swift");
        output.append("// 当前list: " + list + "\n\n");
        
        // 5. 其他常用操作
        output.append("5. 其他常用操作：\n");
        output.append("list.size();             // 返回元素个数, O(1)\n");
        output.append("list.isEmpty();          // 检查是否为空, O(1)\n");
        output.append("list.clear();            // 清空所有元素, O(n)\n");
        output.append("list.toArray();          // 转换为数组, O(n)\n");
        output.append("list.subList(1, 3);      // 获取子列表, O(1)\n\n");
        
        // 6. 批量操作
        output.append("6. 批量操作：\n");
        output.append("List<String> languages = Arrays.asList(\"Go\", \"Rust\", \"JavaScript\");\n");
        output.append("list.addAll(languages);  // 批量添加, O(n)\n");
        list.clear();
        list.add("C++");
        list.add("Kotlin");
        List<String> languages = Arrays.asList("Go", "Rust", "JavaScript");
        list.addAll(languages);
        output.append("// 当前list: " + list + "\n");
        output.append("list.addAll(1, languages); // 在指定位置批量添加, O(n)\n");
        list.addAll(1, languages);
        output.append("// 当前list: " + list + "\n\n");
        
        // 7. 遍历方式
        output.append("7. 遍历方式：\n");
        output.append("// 方式1: for循环\n");
        output.append("for (int i = 0; i < list.size(); i++) {\n");
        output.append("    System.out.println(list.get(i));\n");
        output.append("}\n\n");
        
        output.append("// 方式2: 增强for循环\n");
        output.append("for (String item : list) {\n");
        output.append("    System.out.println(item);\n");
        output.append("}\n\n");
        
        output.append("// 方式3: 迭代器\n");
        output.append("Iterator<String> iterator = list.iterator();\n");
        output.append("while (iterator.hasNext()) {\n");
        output.append("    System.out.println(iterator.next());\n");
        output.append("}\n\n");
        
        output.append("// 方式4: Lambda表达式 (Java 8+)\n");
        output.append("list.forEach(item -> System.out.println(item));\n");
        
        updateOutput(output.toString());
    }
    
    /**
     * 展示ArrayList扩容机制
     */
    private void demonstrateArrayListResizing() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== ArrayList扩容机制 ===\n\n");
        
        // 1. 初始容量
        output.append("1. 初始容量：\n");
        output.append("• 无参构造函数：底层是空数组，首次添加时扩容为10\n");
        output.append("• 有参构造函数：指定初始容量\n\n");
        
        // 2. 扩容触发条件
        output.append("2. 扩容触发条件：\n");
        output.append("• 添加元素时，如果size == elementData.length，则需要扩容\n\n");
        
        // 3. 扩容算法
        output.append("3. 扩容算法：\n");
        output.append("• JDK 1.8之前：新容量 = 旧容量 * 3/2 + 1\n");
        output.append("• JDK 1.8及之后：新容量 = 旧容量 + 旧容量/2（即1.5倍）\n");
        output.append("• 代码实现：int newCapacity = oldCapacity + (oldCapacity >> 1);\n\n");
        
        // 4. 扩容步骤
        output.append("4. 扩容步骤：\n");
        output.append("① 计算新容量\n");
        output.append("② 创建新数组\n");
        output.append("③ 复制元素到新数组（System.arraycopy）\n");
        output.append("④ 使用新数组替换旧数组\n\n");
        
        // 5. 性能考虑
        output.append("5. 性能考虑：\n");
        output.append("• 扩容操作成本较高，涉及数组复制\n");
        output.append("• 预知元素数量时，建议指定初始容量\n");
        output.append("• 初始容量计算公式：预估元素数量 / 0.75 + 1\n");
        output.append("• 频繁添加大量元素时，可以使用ensureCapacity手动扩容\n");
        
        updateOutput(output.toString());
    }
    
    /**
     * 展示ArrayList使用注意事项
     */
    private void demonstrateArrayListPitfalls() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== ArrayList使用注意事项 ===\n\n");
        
        // 1. 线程安全问题
        output.append("1. 线程安全问题：\n");
        output.append("• ArrayList非线程安全，多线程下可能导致数据不一致\n");
        output.append("• 解决方案：\n");
        output.append("  - 使用Collections.synchronizedList包装\n");
        output.append("  - 使用CopyOnWriteArrayList\n");
        output.append("  - 使用显式锁（Lock）或同步块（synchronized）\n\n");
        
        // 2. 删除元素的陷阱
        output.append("2. 删除元素的陷阱：\n");
        output.append("// 错误方式：在for循环中直接删除元素\n");
        output.append("List<String> list = new ArrayList<>(Arrays.asList(\"A\", \"B\", \"C\", \"D\"));\n");
        output.append("for (int i = 0; i < list.size(); i++) {\n");
        output.append("    if (list.get(i).equals(\"B\")) {\n");
        output.append("        list.remove(i); // 错误：删除后索引变化，可能跳过元素\n");
        output.append("    }\n");
        output.append("}\n\n");
        
        output.append("// 错误方式：在foreach循环中删除元素\n");
        output.append("for (String item : list) {\n");
        output.append("    if (item.equals(\"C\")) {\n");
        output.append("        list.remove(item); // 错误：抛出ConcurrentModificationException\n");
        output.append("    }\n");
        output.append("}\n\n");
        
        output.append("// 正确方式1：使用迭代器的remove方法\n");
        output.append("Iterator<String> iterator = list.iterator();\n");
        output.append("while (iterator.hasNext()) {\n");
        output.append("    if (iterator.next().equals(\"D\")) {\n");
        output.append("        iterator.remove(); // 正确\n");
        output.append("    }\n");
        output.append("}\n\n");
        
        output.append("// 正确方式2：倒序遍历删除\n");
        output.append("for (int i = list.size() - 1; i >= 0; i--) {\n");
        output.append("    if (list.get(i).equals(\"A\")) {\n");
        output.append("        list.remove(i); // 正确：不会影响未遍历的元素\n");
        output.append("    }\n");
        output.append("}\n\n");
        
        // 3. 其他常见陷阱
        output.append("3. 其他常见陷阱：\n");
        output.append("• 频繁在中间位置插入/删除：考虑使用LinkedList\n");
        output.append("• Arrays.asList返回的列表大小固定，不支持add/remove\n");
        output.append("• 使用subList返回的视图修改会影响原列表\n");
        output.append("• 基本类型需要使用包装类，考虑装箱拆箱开销\n");
        output.append("• 并发修改导致的ConcurrentModificationException\n");
        
        updateOutput(output.toString());
    }
    
    /**
     * 展示ArrayList常见面试题
     */
    private void demonstrateInterviewQuestions() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== ArrayList面试题 ===\n\n");
        
        // 1. ArrayList与LinkedList区别
        output.append("1. ArrayList与LinkedList的区别？\n");
        output.append("答：主要区别有：\n");
        output.append("• 底层实现：ArrayList基于动态数组；LinkedList基于双向链表\n");
        output.append("• 随机访问：ArrayList O(1)；LinkedList O(n)\n");
        output.append("• 插入删除：ArrayList 在末尾O(1)，在中间O(n)；LinkedList 在头尾O(1)，在中间O(n)但无需移动元素\n");
        output.append("• 内存占用：ArrayList少；LinkedList每个元素额外需要两个引用（前后节点）\n");
        output.append("• 适用场景：ArrayList适合随机访问；LinkedList适合频繁插入删除\n\n");
        
        // 2. ArrayList与Vector区别
        output.append("2. ArrayList与Vector的区别？\n");
        output.append("答：主要区别有：\n");
        output.append("• 线程安全：ArrayList非线程安全；Vector线程安全（同步方法）\n");
        output.append("• 性能：ArrayList性能较好；Vector由于同步性能较差\n");
        output.append("• 扩容策略：ArrayList增长50%；Vector默认增长100%（可指定增量）\n");
        output.append("• 发布版本：ArrayList是JDK 1.2引入；Vector是JDK 1.0引入的旧类\n\n");
        
        // 3. ArrayList是如何实现随机访问的
        output.append("3. ArrayList是如何实现随机访问的？\n");
        output.append("答：ArrayList实现了RandomAccess接口，底层是数组：\n");
        output.append("• 通过数组下标直接访问元素: elementData[index]\n");
        output.append("• get和set方法的时间复杂度都是O(1)\n");
        output.append("• RandomAccess接口是一个标记接口，用于标识该类支持快速随机访问\n\n");
        
        // 4. 如何实现ArrayList线程安全
        output.append("4. 如何实现ArrayList的线程安全？\n");
        output.append("答：常见方法有：\n");
        output.append("• 使用Collections工具类包装：\n");
        output.append("  List<E> synList = Collections.synchronizedList(new ArrayList<>());\n");
        output.append("• 使用CopyOnWriteArrayList：\n");
        output.append("  List<E> cowList = new CopyOnWriteArrayList<>(); // 读多写少的场景\n");
        output.append("• 使用显式锁或同步块：\n");
        output.append("  synchronized(list) { list.add(e); } // 手动同步\n\n");
        
        // 5. 如何边遍历边删除
        output.append("5. 如何在遍历ArrayList的同时安全地删除元素？\n");
        output.append("答：安全的方法有：\n");
        output.append("• 使用迭代器的remove方法：\n");
        output.append("  Iterator<E> it = list.iterator();\n");
        output.append("  while(it.hasNext()) {\n");
        output.append("      E element = it.next();\n");
        output.append("      if(condition) it.remove(); // 安全删除当前元素\n");
        output.append("  }\n");
        output.append("• 使用removeIf方法（Java 8+）：\n");
        output.append("  list.removeIf(e -> condition);\n");
        output.append("• 从后向前遍历并删除：\n");
        output.append("  for(int i = list.size()-1; i >= 0; i--) {\n");
        output.append("      if(condition) list.remove(i);\n");
        output.append("  }\n");
        
        updateOutput(output.toString());
    }
    
    /**
     * 更新输出文本
     */
    private void updateOutput(String text) {
        tvOutput.append(text);
    }
} 